<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Redis;
use App\Model\Goods;
use App\Model\Goodsattr;
use App\Model\Goodspic;
use App\Model\Goodsspecs;
use App\Model\Goodssale;

class GoodsDetailSelect extends Controller
{
    // 找促销商品
    public function GetPromateData($id)
    {
        // 促销商品的集合名
        $promatesetkey = 'goods_sale_set_data';

        // 促销商品哈希键名
        $promatehashkey = "goods_sale_hash_data:".$id;

        // 判断集合内是否有该哈希
        $bool = Redis::sisMember($promatesetkey, $promatehashkey);

        // 判断是否存在
        if ($bool) {
            // 在redis查找该商品
            $promategoods = Redis::hGetAll($promatehashkey);

            // 准备开始结束时间
            $start = strtotime($promategoods['start_time']);
            // 准备结束时间
            $stop = strtotime($promategoods['end_time']);
            // 判断是否开始促销或者结束促销
            if ($start < time() &&  $stop > time()) {
                return $promategoods;
            }
            // 促销结束返回false
            return false;
        } else {
            // 查找促销商品信息
            $promatemysql = Goodssale::select('id', 'goods_name', 'start_time', 'end_time', 'price', 'promate_price', 'promate_num')
                ->where('goods_id', $id)
                ->get();
            // 判断是否为促销
            if (isset($promatemysql[0])) {
                // 查到商品销售量和商品图片
                $goods = Goods::select('goods_pic')->where('id', $id)->first();


                // 准备开始结束时间
                $start = strtotime($promatemysql[0]->start_time);
                // 准备结束时间
                $stop = strtotime($promatemysql[0]->end_time);

                // 判断是否正在促销
                if ($start < time() &&  $stop > time()) {

                    //添加到Redis
                    Redis::sAdd($promatesetkey, $promatehashkey);
                    Redis::hMSet($promatehashkey, [
                      'id' => $promatemysql[0]->id,
                      'goods_id' => $id,
                      'goods_name' => $promatemysql[0]->goods_name,
                      'goods_pic' => $goods->goods_pic,
                      'start_time' => $promatemysql[0]->start_time,
                      'end_time' => $promatemysql[0]->end_time,
                      'price' => $promatemysql[0]->price,
                      'buy_num' => 0,
                      'promate_price' => $promatemysql[0]->promate_price,
                      'promate_num' => $promatemysql[0]->promate_num,
                    ]);

                    // 商品图片名的集合名
                    $picsetkey = 'goods_set_pic_data:'.$id;
                    // 查找是否存在
                    $pic = Redis::exists($picsetkey);

                    if (!$pic) {
                        // 找到该促销的图片
                        $pics = Goodspic::select('pic')->where('goods_id', $id)->get()->toArray();
                        // 循环添加图片
                        foreach($pics as $pic) {
                            $pic[] = $pic['pic'];
                        }
                    }

                    // 在redis查找该商品
                    $promategoods = Redis::hGetAll($promatehashkey);
                    return $promategoods;
                }
                return false;
            }
        }
        return false;
    }

    // 找热销商品
    public function GetHotData($id)
    {
        // 热销商品集合键名
        $hotsetkey = 'hot_goods_set';

        // 热销商品哈希键名
        $hothashkey = 'hot_goods_hash_id:'.$id;

        $bool = Redis::sisMember($hotsetkey, $hothashkey);

        // 判断
        if ($bool) {
            // 在redis查找该商品
            $hotgoods = Redis::hGetAll($hothashkey);
            // 返回促销商品数据
            return $hotgoods;
        } else {

            // 查找促销商品信息
            $mysqlhotgoods = Goods::select('id', 'goods_pic', 'goods_name', 'price', 'buy_num')->where([['id', '=',$id], ['buy_num', '>', 100]])->get();
            // 判断是否为促销
            if (isset($mysqlhotgoods[0])) {

                    //添加到Redis
                    Redis::sAdd($hotsetkey, $hothashkey);
                    Redis::hMSet($hothashkey, [
                      'id'        => $mysqlhotgoods[0]->id,
                      'goods_name'=> $mysqlhotgoods[0]->goods_name,
                      'goods_pic' => $mysqlhotgoods[0]->goods_pic,
                      'price'     => $mysqlhotgoods[0]->price,
                      'buy_num'   => $mysqlhotgoods[0]->buy_num,
                    ]);

                    // 商品图片名的集合名
                    $picsetkey = 'goods_set_pic_data:'.$id;
                    // 查找是否存在
                    $pic = Redis::exists($picsetkey);

                    if (!$pic) {
                        // 找到该促销的图片
                        $pics = Goodspic::select('pic')->where('goods_id', $id)->get()->toArray();
                        // 循环添加图片
                        foreach($pics as $pic) {
                            $pic[] = $pic['pic'];
                        }
                    }

                    // 在redis查找该商品
                    $hotgoods = Redis::hGetAll($hothashkey);
                    return $hotgoods;
                }
                return false;
            }
        return false;
    }

    // 拿出普通商品数据
    public function GetGenearlData($id)
    {
        $goods = Goods::find($id);

        return $goods;
    }

    // 找拿出商品详情
    public function GetColorDetail($id)
    {
        // 准备详情集合键名
        $colorsetkey = 'goods_set_color_data:'.$id;
        $sizesetkey = 'goods_set_size_data:'.$id;

        // 准备促销热销集合名
        $promatesetkey = 'goods_sale_set_data';
        $hotsetkey = 'hot_goods_set';

        // 促销商品和热销商品的哈希键名
        $promatehashkey = "goods_sale_hash_data:".$id;
        $hothashkey = 'hot_goods_hash_id:'.$id;

        // 查找是否存在
        $color = Redis::exists($colorsetkey);
        $size = Redis::exists($sizesetkey);
        // 判断是否为空
        if ($color && $size) {
            $colordata = Redis::sMembers($colorsetkey);
            $sizedata = Redis::sMembers($sizesetkey);

            return [$colordata, $sizedata];
        }

        // 判断该商品是否为促销商品，如果为促销商品，就将详情放到集合中，再取出来返回
        if (Redis::sisMember($promatesetkey, $promatehashkey)) {
            // 在mysql找到详情
            $color = Goodsattr::select('color')->where('goods_id', $id)->groupBy('color')->get()->toArray();
            $size = Goodsattr::select('size')->where('goods_id', $id)->groupBy('size')->get()->toArray();

            // 重新添加
            foreach ($color as $v) {
                Redis::sAdd($colorsetkey, $v['color']);
            }

            foreach ($size as $val) {
                Redis::sAdd($sizesetkey, $val['size']);
            }

            // 再从redis拿去
            $colordata = Redis::sMembers($colorsetkey);
            $sizedata = Redis::sMembers($sizesetkey);

            // 返回数组
            return [$colordata, $sizedata];
        }

        // 判断该商品是否为热销商品，如果为热销商品，就将详情放到集合中，再取出来返回
        if (Redis::sisMember($hotsetkey, $hothashkey)) {
            // 在mysql找到
            $color = \DB::table('shop_goods_attrs')->select('color')->where('goods_id', $id)->groupBy('color')->get()->toArray();
            $size = \DB::table('shop_goods_attrs')->select('size')->where('goods_id', $id)->groupBy('size')->get()->toArray();

            // 重新添加到redis
            foreach ($color as $v) {
                Redis::sAdd($colorsetkey, $v->color);
            }

            foreach ($size as $val) {
                Redis::sAdd($sizesetkey, $val->size);
            }

            // 再从redis拿出来
            $colordata = Redis::sMembers($colorsetkey);
            $sizedata = Redis::sMembers($sizesetkey);

            // 返回数组
            return [$colordata, $sizedata];
        }


        // 判断是否有详情
        $mysqlgoods = Goods::where('id', $id)->get();
        if (!isset($mysqlgoods[0])) {
            return redirect()->route('notfound');
        }

        $color = Goodsattr::select('color')->where('goods_id', $id)->groupBy('color')->get()->toArray();
        $size = Goodsattr::select('size')->where('goods_id', $id)->groupBy('size')->get()->toArray();

        // 返回详情数据
        return [$color, $size];
    }

    // 获取商品图片
    public function GoodsPic($id)
    {
        // 商品图片名的集合名
        $picsetkey = 'goods_set_pic_data:'.$id;
        // 查找是否存在
        $pic = Redis::exists($picsetkey);

        // 判断是否存在
        if ($pic) {
            // 存在就去找
            $picdata = Redis::sMembers($picsetkey);
            // 返回数组
            return $picdata;
        }
        // 去mysql获取图片
        $picdata = Goodspic::select('pic')->where('goods_id', $id)->get()->toArray();

        // 循环成以为数组
        foreach ($picdata as $v) {

            $picdatas[] = $v['pic'];
        }
        // 判断是否存在图片
        if (!empty($picdatas)) {
            return $picdatas;
        }

    }

    // 获取商品介绍
    public function GoodsContent($id)
    {
        // 找到详情
        $content = Goodsspecs::select('goods_desc', 'goods_content')
            ->where('goods_id', $id)
            ->get();

        // 判断是否存在
        if (isset($content[0])) {
            // 存在返回数据
            return $content[0];
        }

    }

}
